#include <assert.h>
#include <sys/printk.h>
#include <stdio.h>
#include <stdarg.h>

static char buf[1024];

static void spin(const char *func)
{
	printk("spin in %s...", func);
	while(1);
}

void __assert_fail(const char *expr, const char *file, int line, const char *func)
{
	printk(ANSI_FG_RED
		"\n---> assert(%s) failed!!!"
		"\n---> file: %s"
		"\n---> func: %s"
		"\n---> line: %d\n",
		expr, file, func, line);
	
	spin("__assert_fail()");
	asm volatile("ud2");	// 不可能到这里，否则出错
}

void panic(const char *fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);
	vsprintf(buf, fmt, ap);
	va_end(ap);
	printk("\n"ANSI_FG_RED
	"!!! PANIC !!!"
	"             "
	"             "
	"         :(\n"
	"---> %s\n", buf);
	spin("panic()");
	asm volatile("ud2");	// 不可能到这里，否则出错
}
